BOJ_2138 전구와 스위치
그리디로 접근하여 푸는 문제
i번째 전구를 누르면 i-1, i, i+1의 숫자가 바뀌게 된다
어떤 순서로 눌러도 결과는 같기 때문에 맨 앞에서부터 차례대로 탐색하면 되며,
전구의 색이 다르면 -> 같게 만들면서 그리디하게 풀어나간다
N=1부터 i-1~N까지 비교하며 만약 i-1의 전구 색이 다르다면 현재 전구를 누른다
왜냐하면 i번 째에 전구를 누르지 않는다면 더 이상 i-1의 전구 색을 바꿀 수 없기 때문!
그렇게 끝까지 비교해 나가며 N번째에는 N-1과 N의 색만 바꿔준다
이 문제의 핵심은 첫 번째 전구에 있다
첫 번째 전구는 비교할 수 있는 이전 전구가 존재하지 않기 때문이다
그렇기 때문에 첫 번째 전구를 눌렀을 때/누르지 않았을 때 2가지로 경우를 나누어 2번 탐색해야 한다
package BJO;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.stream.Stream;
public class BJO_2138_전구와스위치 {
static int N;
static int[] answer;
static int minCnt = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
int[] bulb = Stream.ofparseInt).toArray(;
answer = Stream.ofparseInt).toArray(;
// 첫 번째 스위치를 누르는 경우와 누르지 않는 경우로 나눈다
int[] firstClickBulb = Arrays.copyOf(bulb, bulb.length);
firstClickBulb[0] ^= 1;
firstClickBulb[1] ^= 1;
clickClick(bulb, 0);
clickClick(firstClickBulb, 1);
// System.out.println(Arrays.toString(bulb));
// System.out.println(Arrays.toString(firstClickBulb));
System.out.println(minCnt == Integer.MAX_VALUE ? -1 : minCnt);
}
static void clickClick(int[] now, int cnt) {
for (int i = 1; i < now.length; i++) {
if (now[i - 1] != answer[i - 1]) {
cnt++;
now[i - 1] = now[i - 1] ^ 1;
now[i] = now[i] ^ 1;
if (i + 1 < now.length) {
now[i + 1] ^= 1;
}
}
}
if (correctCheck(now)) {
minCnt = Math.min(cnt, minCnt);
}
}
static boolean correctCheck(int[] now) {
for (int i = 0; i < N; i++) {
if (now[i] != answer[i]) {
return false;
}
}
return true;
}
}